Skip to content

release: PLAN33 Orca 対応(コンテナを SSH target として接続可能に)#81

Merged
takemi-ohama merged 13 commits into
mainfrom
release/PLAN33
Jul 14, 2026
Merged

release: PLAN33 Orca 対応(コンテナを SSH target として接続可能に)#81
takemi-ohama merged 13 commits into
mainfrom
release/PLAN33

Conversation

@takemi-ohama

@takemi-ohama takemi-ohama commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Summary

背景 / 解決したい課題

Orca は「SSH target 上に git worktree を作り、AI エージェント (claude / codex / gemini 等) も SSH target 側で動かし、editor/diff だけ手元で使う」リモート開発モデルを採る。現状 devbase が起動するコンテナは SSH で入れないため、Orca から接続してコンテナ内で worktree / エージェントを動かせなかった。

docker exec / ProxyCommand 方式は Orca の file explorer / diff / worktree がホスト側を向いてしまい SFTP も使えないため採らず、コンテナ内 sshd を publish して「普通の SSH host」として見せる構成にした。

変更内容(release ブランチ全体)

  • base イメージ: openssh-server を追加し、/etc/ssh/sshd_config.d/ に Orca 向け設定(公開鍵認証のみ・Password 無効・AllowTcpForwarding yes)を配置。ENABLE_SSH=true の opt-in(ENABLE_DIND と同じパターン)で entrypoint が sshd を起動する。host key は /persistent/ai/ssh/ に永続化し、再ビルド/再作成でも Orca の known_hosts 警告が出ないようにする。SSH_AUTHORIZED_KEYS(laptop の公開鍵)を ~/.ssh/authorized_keys/persistent/ai/.ssh に永続化)へ展開する。
  • ポート publish: devbase up 時、ENABLE_SSH 有効なら各 dev インスタンスの :22 をホストの <bind>:<port> に publish する。ポートは (project, index) から決定的に算出(既定 base 2200downup を跨いで一定)。bind 既定は 127.0.0.1(外部非公開)。
  • ホスト側 Orca 隔離 config: ~/.config/devbase/orca/ssh_config を稼働中コンテナ(docker inspect の compose ラベル + 22/tcp publish で判定)から全生成する。ホストの ~/.ssh/config は一切触らないため、Orca にこのファイルだけを import すれば devbase コンテナ以外は見えない(隔離要件)。devbase up/down に best-effort で同期/剪定を連動(失敗しても up/down は倒さない)。
  • devbase orca コマンド: sync(再生成)/ prune(停止分の剪定 = 再生成)/ status(config パス・内容・import 手順の表示)。
  • devbase env init: laptop の公開鍵(~/.ssh/id_ed25519.pubid_rsa.pub)を SSH_AUTHORIZED_KEYS として収集する collector を追加。
  • ドキュメント: docs/user/orca.md(接続ガイド: macOS 直結 / Windows→macOS トンネル・Tailscale、Ports tab、トラブルシュート)+ README 導線。

plan: issues/PLAN33_orca-support.md

Test plan(結合観点のみ/実機・手動)

⚠ base(Dockerfile / entrypoint)変更の反映には devbase build --no-cache が必要。ENABLE_SSH は小文字 true(または 1)で指定すること。

  • devbase build --no-cache 後に sshd 入りイメージが生成される
  • ENABLE_SSH=truedevbase upssh -p <port> ubuntu@127.0.0.1 'whoami; git --version' が通る
  • ssh ... 'claude --version || codex --version || gemini --version' が通る
  • devbase orca sync 生成ファイルを Orca に import → SSH target Test 成功 / worktree 作成がコンテナ側で走る
  • scale 2 で 2 target が別ポートで登録され両方接続できる
  • devbase down 後に Orca エントリが剪定される(devbase orca status で確認)
  • 再ビルド後も host key 永続化により Orca の known_hosts 警告が出ない
  • Windows→Mac トンネル経由 / DEVBASE_ORCA_HOSTNAME(Tailscale)で Orca 接続成功

自動テスト

  • 単体: tests/volume/test_compose_ssh_ports.py(ポート publish・決定性)、tests/commands/test_orca.py(config 生成・隔離・剪定)
  • 全体回帰: uv run pytest tests/879 passed
開発用: 個別 PR(レビュー対象外・全て release へ merge 済み)

takemi-ohama and others added 5 commits July 14, 2026 09:05
* chore: PLAN33-port-publish Draft PR 作成

* feat(compose): ENABLE_SSH 時に SSH ポートを決定的に publish (PLAN33 PR2)

Orca からコンテナへ SSH 接続できるよう、ENABLE_SSH=true のとき
generate_scaled_compose が各 dev-<index> サービスへ <bind>:<port>:22 を
publish する。

- env/keys.py: ENABLE_SSH / DEVBASE_SSH_BIND / DEVBASE_SSH_PORT_BASE を追加
- volume/ports.py (新規): sha1 ベースの安定ハッシュで (project, index) →
  host port を決定的に算出 (down→up を跨いで一定)
- volume/compose.py: project_name を _build_scaled_services /
  _build_dev_instance へ通し、ENABLE_SSH 有効時のみ ports を注入
- tests/volume/test_compose_ssh_ports.py (新規): 有効/無効・bind・base・
  決定性・衝突回避の単体テスト

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore: PLAN33-base-sshd Draft PR 作成

* feat(base): openssh-server 追加と ENABLE_SSH による sshd 起動 (PLAN33 PR1)

Orca 連携のため base イメージを SSH target 化する。

- containers/base/Dockerfile: 最初の apt-get に openssh-server を追加。
  root のうちに /run/sshd と /etc/ssh/sshd_config.d/10-devbase-orca.conf
  (公開鍵認証のみ・Password 無効・TcpForwarding 有効)を作成。
- containers/base/entrypoint.sh: ENABLE_SSH=true/1 で sshd を起動する
  ブロックを追加。AI 設定 symlink 生成後(~/.ssh が /persistent/ai/.ssh
  へ張り替え済み)かつ exec "$@" 前に配置。host key を /persistent/ai/ssh
  に永続化・復元し、SSH_AUTHORIZED_KEYS を authorized_keys へ展開。
- docs/user/container-operations.md: openssh-server 同梱と ENABLE_SSH、
  host key 永続化、base 変更に build --no-cache が要る旨を追記。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore: PLAN33-docs Draft PR 作成

* docs: Orca 接続ガイドを追加し README/docs 索引に導線を追記

コンテナ内 sshd を publish して Orca の SSH target として接続する
エンドツーエンドの手順を docs/user/orca.md に追加。base 再ビルド →
env init(公開鍵)→ ENABLE_SSH で up → devbase orca sync →
Orca への import → worktree 作成までを網羅。macOS 直結 /
Windows→macOS(SSH トンネル・Tailscale)の 2 パターン、環境変数一覧、
隔離設計、Ports tab、トラブルシュート(docker exec/ProxyCommand を
採らない理由・host key 永続化)を記載。README.md と docs/README.md の
機能一覧・ドキュメント索引に導線を追記。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Orca からコンテナへ SSH 接続するための、ホスト側の隔離 SSH config 生成と
`devbase orca` コマンド、up/down フックを追加する。

- `devbase orca sync/prune/status`: 稼働中の SSH publish 済みコンテナを
  docker inspect で列挙し (コンテナ名の dash split はせず compose ラベルと
  22/tcp publish で判定)、`~/.config/devbase/orca/ssh_config` を全再生成する。
  他ホストを一切書かないため Orca への import で隔離が成立する。
- up 完了後に ENABLE_SSH 有効時のみ orca sync、down 後に orca prune を
  best-effort で呼ぶ (失敗しても up/down の戻り値は変えない)。
- collectors/orca.py: laptop の公開鍵を SSH_AUTHORIZED_KEYS として、
  HostName 用 DEVBASE_ORCA_HOSTNAME を env init で収集する。
- keys.py に SSH_AUTHORIZED_KEYS / DEVBASE_ORCA_HOSTNAME を追加。
- cli.py / bin/devbase に orca サブコマンドを配線。
- tests/commands/test_orca.py: レンダリング・隔離・prune・列挙の単体テスト
  (実 docker は呼ばず fake targets / サンプル JSON を注入)。

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
release ブランチが self-documenting になるよう、実装の設計根拠 (PR 分割計画・
設計判断・E2E テスト計画) と元 issue / アドバイスを issues/ 配下に追加する。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@takemi-ohama
takemi-ohama marked this pull request as ready for review July 14, 2026 00:17

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | REQUEST_CHANGES

修正が必要な問題を4件インラインで指摘しました。

Comment thread lib/devbase/commands/orca.py
Comment thread lib/devbase/volume/ports.py
Comment thread docs/user/orca.md Outdated
Comment thread lib/devbase/commands/orca.py Outdated

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | gemini | APPROVE

本PRにおける変更は既存アーキテクチャと整合しており、副作用や構造的なリスクは見当たりません。修正を提案する事項はありません。

- 隔離: dev コンテナへ dev.devbase.ssh ラベルを付与し、_parse_inspect の
  必須条件に追加。22/tcp を publish する他 Compose プロジェクトの混入を防ぐ。
- ポート衝突: allocate_ssh_host_port を追加し、決定的ポートを優先しつつ
  同一生成内 + 他プロジェクト稼働 publish (best-effort docker 照会) と衝突する
  場合は線形探索で回避。決定性は衝突が無い限り保つ。
- docs: env init が収集するのは Mac の公開鍵である点を明記し、Windows の Orca
  では Windows の公開鍵を SSH_AUTHORIZED_KEYS に登録する手順・複数鍵対応・
  IdentityFile の対応関係を追記。
- エラーハンドリング: _running_ssh_targets が列挙失敗時に None を返し、
  regenerate_config は OrcaEnumerationError を送出して既存 config を保持。
  sync/prune CLI は非ゼロ終了、up/down フックは warning のみ。

tests: 889 passed (+10)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ (round 1)

codex の指摘 4 件 (すべて major) にコード修正で対応しました。

深刻度 件数 対応
critical 0 -
major 4 4 件対応 (3 件完全対応 / 1 件は同一生成内は完全・跨ぎは best-effort)
minor 0 -
nit 0 -

対応内容

  1. [セキュリティ/隔離] orca.py _parse_inspect — dev コンテナへ dev.devbase.ssh=1 ラベルを付与し必須条件に追加。22/tcp を publish する devbase 以外の Compose コンテナの混入を防止。
  2. [正確性] ports.py ポート衝突allocate_ssh_host_port を追加。決定的ポートを優先しつつ、同一生成内 + 他プロジェクト稼働 publish (up 経路で docker ps を best-effort 収集) と衝突する場合は線形探索で回避。決定性は衝突が無い限り保持。残存リスク: 生成時に相手コンテナ未起動 / docker 照会失敗時は跨ぎ衝突が残り得る (同一生成内は必ず回避)。
  3. [正確性/docs] orca.mdSSH_AUTHORIZED_KEYS は Orca を動かすマシンの公開鍵である点を明記。macOS Orca / Windows Orca の登録手順を分離、複数鍵対応と IdentityFile の対応関係を追記。
  4. [エラーハンドリング] orca.py 再生成 — 列挙失敗 (None) と稼働 0 件 ([]) を区別。失敗時は OrcaEnumerationError で既存 config を保持、CLI は非ゼロ終了、フックは warning のみ。

commit / CI

  • commit: 8d1e553
  • テスト: uv run pytest tests/ -q889 passed (879 → +10)
  • CI: このリポジトリに自動 CI ワークフローは設定なし (ローカルで全テスト green を確認)

4 スレッドすべてに返信・resolve 済みです。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | codex | REQUEST_CHANGES

スケール経路で既存 SSH ポートを維持し、新規インスタンス起動後に Orca config を同期する必要があります。

Comment thread lib/devbase/commands/container.py Outdated
Comment thread lib/devbase/commands/container.py

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 2 | gemini | REQUEST_CHANGES

Orca 連携における SSH config の自動生成・ポート計算処理についてレビューしました。隔離 config によってユーザー側の設定を汚さない方針は堅牢ですが、オンラインスケール時のポート計算や一部の連携においてエッジケースが存在するため、以下の修正を提案します。

  • devbase scale 時の他コンテナのポート取得処理 (docker ps) が自プロジェクトの稼働中ポートも含んでしまうため、スケール実行時にポート衝突判定が起こり、意図せぬコンテナの Recreate が発生する点を修正してください。
  • devbase scale 後に Orca config の更新が漏れているため同期処理を追加してください。

Comment thread lib/devbase/volume/compose.py Outdated
Comment thread lib/devbase/commands/container.py Outdated
Comment thread lib/devbase/commands/orca.py Outdated
cross-review round 2 の指摘 3 件に対応。

A [major/正確性] SSH ポート衝突回避が自プロジェクトの稼働ポートまで数え、
  devbase scale で既存 dev-1..N の決定的ポートが +1 ずれて --no-recreate と
  不整合になる問題を修正。_running_published_host_ports に exclude_project 引数を
  追加し com.docker.compose.project ラベルで自プロジェクトを除外。up/scale の
  呼び出し側から現在の project_name を渡す。

B [major/状態同期] cmd_scale がスケールアウト後に Orca config を再生成せず、
  追加インスタンスが手動 sync まで現れない問題を修正。up 経路同様に成功時
  best-effort で _maybe_orca_sync() を呼ぶ。

C [minor/UX] 生成 config の IdentityFile を ~/.ssh/id_ed25519 固定にしていたため
  id_rsa のみのユーザーで不一致警告が出る問題を修正。IdentityFile 行を出力せず
  SSH クライアント/Orca の既定鍵解決に委ねる。docs/user/orca.md も追随。

テスト: A の自プロジェクト除外/他プロジェクト衝突と C の IdentityFile 非出力を追加。
uv run pytest tests/ -q は 895 passed。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@takemi-ohama

takemi-ohama commented Jul 14, 2026

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ (round 2)

cross-review round 2 の指摘に対応し release/PLAN33 を更新しました。

修正 commit: ea69642

# 重要度 内容 対応
A major / 正確性 SSH ポート衝突回避が自プロジェクトの稼働ポートも数え、devbase scale で既存 dev-1..N の決定的ポートがずれ --no-recreate と不整合 _running_published_host_portsexclude_project を追加し com.docker.compose.project ラベルで自プロジェクトを除外。up/scale から現 project_name を渡す
B major / 状態同期 cmd_scale がスケールアウト後に Orca config を再生成せず追加インスタンスが手動 sync まで現れない 成功時 (readiness 確認後) に up 経路同様 best-effort で _maybe_orca_sync() を呼ぶ
C minor / UX 生成 config の IdentityFile~/.ssh/id_ed25519 固定で id_rsa のみのユーザーに不一致警告 IdentityFile 行の出力を廃止し既定鍵解決に委ねる。docs/user/orca.md も追随

重要度別: critical 0 / major 2 / minor 1 / nit 0(重複スレッド含め 5 スレッドを reply + resolve)

テスト: A の自プロジェクト除外・他プロジェクト衝突、C の IdentityFile 非出力を追加。uv run pytest tests/ -q895 passed(従来 889 + 6)。

CI: commit ea69642 の GitHub Actions チェック(Python syntax 3.10/3.11/3.12・Ruff lint・ShellCheck)は全て success

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 3 | codex | REQUEST_CHANGES

SSH host key の初期生成をインストール単位の固有鍵にし、scale の同時起動でも共有永続領域を安全に初期化してください。

Comment thread containers/base/entrypoint.sh Outdated

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 3 | gemini | APPROVE

モジュール外から利用されるプライベート関数の存在と、一部の型アノテーションの不一致を指摘しています。機能自体の実装・テスト・ドキュメントは非常に丁寧に書かれており問題ありません。

Comment thread lib/devbase/commands/container.py Outdated
Comment thread lib/devbase/commands/orca.py Outdated
クロスレビュー round 3 の指摘 3 件に対応。

- [major/security] entrypoint.sh: openssh-server がビルド時に生成する
  /etc/ssh/ssh_host_*_key を初回起動時に破棄してから ssh-keygen -A で再生成し、
  イメージ由来の予測可能な共通 host key が全 install で共有される問題を修正。
  生成/復元+永続化を flock で直列化し、同一ボリューム共有時の競合 (TOCTOU) を回避。
- [minor] compose._running_published_host_ports を public 名
  get_running_published_host_ports へ改名 (定義/import/呼出/テスト全箇所)。
- [minor] cmd_orca の targets_provider 型注釈を
  Optional[Callable[[], Optional[List[SSHTarget]]]] へ修正 (None 返却に整合)。
- docs: host key が install ごとに一意生成される旨を追記 (orca.md / container-operations.md)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ (round 3)

クロスレビュー round 3 の指摘 3 件すべてに対応しました。

# severity 対象 対応
1 major/security containers/base/entrypoint.sh 初回起動時にイメージ焼き込みの /etc/ssh/ssh_host_*_key を破棄→ssh-keygen -A で install 一意な host key を再生成。生成/復元+永続化を flock で直列化 (TOCTOU 回避)
2 minor/maintainability lib/devbase/volume/compose.py _running_published_host_ports → public 名 get_running_published_host_ports へ改名 (全参照更新)
3 minor/correctness lib/devbase/commands/orca.py:285 cmd_orcatargets_provider 型注釈を Optional[Callable[[], Optional[List[SSHTarget]]]] へ修正

severity 内訳: critical 0 / major 1 / minor 2 / nit 0

検証

  • bash -n containers/base/entrypoint.sh
  • shellcheck --severity=error (該当ブロック) 新規指摘なし ✅
  • ruff check ✅ / uv run pytest tests/ -q895 passed

docs (docs/user/orca.md, docs/user/container-operations.md) に host key が install ごとに一意生成される旨を追記済み。

fix commit: 5b301d3

CI (syntax / Ruff / ShellCheck) はこの後 GitHub Actions 上で実行されます (ローカルでは Ruff / pytest / bash -n 全て pass 済み、待機はしません)。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 4 | codex | REQUEST_CHANGES

scale 2 以上の target 識別と、永続化された認証鍵の失効処理を修正してください。

Comment thread lib/devbase/commands/orca.py Outdated
Comment thread containers/base/entrypoint.sh

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 4 | gemini | REQUEST_CHANGES

Windows 環境での USERNAME 参照起因で、Orca からの SSH 接続が失敗する不具合が見つかりました。コンテナのユーザー(ubuntu 固定)と乖離するため修正が必要です。

Comment thread lib/devbase/commands/orca.py Outdated
クロスレビュー round4 の major 指摘 3 件に対応。

1. [correctness] scale>=2 で Orca Host が衝突する問題を修正。
   generate_scaled_compose は dev-1..N を別サービスとして展開するため
   compose の container-number が全て 1 になり、index が全 target で 1 に
   潰れて Host devbase-<project>-1 が衝突していた。SSH publish 時に
   dev.devbase.index ラベルを付与し、_parse_inspect はこのラベルから
   index を読む (未設定時は container-number へフォールバック)。

2. [security] SSH_AUTHORIZED_KEYS を空にしても失効鍵で login できる問題を修正。
   ~/.ssh は永続ストレージへの symlink のため、env を空にしても前回の
   authorized_keys が残っていた。空のときは rm -f で永続鍵を削除して失効を反映する。

3. [correctness] User にホストの USERNAME を使うと SSH 失敗する問題を修正。
   Windows 上の Orca ホストでは USERNAME が Windows アカウント名になるが
   コンテナのログインユーザーは常に ubuntu。ambient な USERNAME は読まず
   ubuntu を既定とし、上書きは devbase 専用の DEVBASE_ORCA_USER のみに限定する。
   keys.py に DEVBASE_ORCA_USER を追加し docs/user/orca.md にも記載。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ (round 4)

round 4 の major 指摘 3 件をすべて修正しました。

重要度別: critical 0 / major 3 / minor 0 / nit 0 — 対応 3 / 見送り 0 / 却下 0

# 種別 指摘 対応
1 correctness scale≥2 で container-number が全て 1 になり Orca Host devbase-<project>-1 が衝突 SSH publish 時に dev.devbase.index ラベルを付与し _parse_inspect がそこから index を取得 (未設定時は container-number へフォールバック)
2 security ~/.ssh が永続 symlink のため SSH_AUTHORIZED_KEYS を空にしても失効鍵で login 可 空のとき rm -f ~/.ssh/authorized_keys で永続鍵を削除し失効を反映 + ログ出力
3 correctness User にホストの USERNAME (Windows アカウント名) を使い SSH 失敗 ambient な USERNAME を読まず既定 ubuntu、上書きは DEVBASE_ORCA_USER のみに限定 (keys.py + docs 追記)

検証: bash -n containers/base/entrypoint.sh clean / uv run pytest tests/ -q900 passed (895 + 新規 5)

commit: 35cf788 (release/PLAN33)

CI: 起動待ち (結果は待たずに報告)。3 スレッドは reply + resolve 済み。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 5 | codex | REQUEST_CHANGES

全プロジェクト横断の SSH config 生成で、プロジェクト別の接続属性を entry ごとに保持するよう修正が必要です。

Comment thread lib/devbase/commands/orca.py Outdated
Comment thread lib/devbase/volume/compose.py Outdated

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 5 | gemini | COMMENT

Orca の SSH 接続基盤と config 自動同期の追加 PR として、意図された設計と既存機能との統合が非常に綺麗に実装されています。
SSH config の隔離、host key の一意生成+永続化による known_hosts 警告の回避、allocate_ssh_host_port におけるホストポートの決定的な算出・衝突回避など、細かい部分まで丁寧に対応されており堅牢です。

数点、状態の同期漏れ(ENABLE_SSH をオフにした際の古い target の残留)と、環境変数のパース時のエラーハンドリングについて修正を提案します。

Comment thread lib/devbase/commands/container.py Outdated
Comment thread lib/devbase/volume/compose.py Outdated
- cross-project sync が全エントリへ実行プロジェクトの User を一律適用し、
  container user の異なる別プロジェクトのエントリがログイン不能になる問題を修正。
  compose 生成時に dev.devbase.user ラベルへ各プロジェクト自身の解決済みユーザーを
  焼き込み、_parse_inspect が per-target で読み取って SSHTarget.user に持たせる。
  _render_config はエントリ毎に User を出力する。

- ENABLE_SSH を true→false に切り替えて再 up した際、停止したコンテナのエントリが
  Orca config に残る問題を修正。_maybe_orca_sync を「SSH 有効 または config 既存」で
  再生成するよう変更。config 未作成の純粋な非 Orca ユーザーでは従来どおり何もしない
  (無用なファイル生成を避ける)。orca.config_exists() を追加。

- DEVBASE_SSH_PORT_BASE が非整数だと up が stacktrace で落ちる問題を修正。
  int 変換を try/except で握り DockerError に変換 (変数名と値を明示)。確保後の
  ホストポートが 1..65535 を超える場合も DockerError にする。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ (round 5)

commit: 9c35679

severity count
critical 0
major 2
minor 1
nit 0

対応内容

  1. [major] cross-project sync の User 一律適用 (orca.py:227) — compose 生成時に各プロジェクト自身の解決済みユーザーを dev.devbase.user ラベルへ焼き込み、SSHTarget.user として per-target で読み取り・出力するよう変更。container user の異なる別プロジェクトのエントリがログイン不能になる問題を解消。
  2. [major] SSH 無効化後の stale エントリ残存 (container.py:454) — _maybe_orca_sync の gate を「SSH 有効 または Orca config 既存」に精緻化 (orca.config_exists() 追加)。true→false 切替後の再 up で stale エントリを剪定しつつ、非 Orca ユーザーには config を新規生成しない。
  3. [minor] DEVBASE_SSH_PORT_BASE 未検証 (compose.py:238, codex+gemini 両スレッド) — 非整数を DockerError に変換し、確保後ポートが 1..65535 超の場合も DockerError に。stacktrace クラッシュを解消。

テスト

uv run pytest tests/ -q912 passed (900 → +12 新規テスト)。per-target User ラベル注入/読取、SSH 無効+config 既存の剪定経路、非整数/範囲超過 base の DockerError を追加。

CI

ローカルの pytest はグリーン。CI の完了は待たずに報告しています (別途確認してください)。

解決済みレビュースレッド: orca.py:227 / container.py:454 / compose.py:238 (codex) / compose.py:238 (gemini) の 4 件。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 6 | codex | REQUEST_CHANGES

Orca 未利用時の down がユーザー設定領域を変更しないよう、prune の実行条件を修正してください。

Comment thread lib/devbase/commands/container.py

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 6 | gemini | REQUEST_CHANGES

devbase down 実行時の _maybe_orca_prune において、非Orcaユーザーの環境(ホームディレクトリ)を汚染してしまう問題が見つかりました。インラインコメントの修正をお願いします。

Comment thread lib/devbase/commands/container.py
down 後の Orca SSH config 剪定が regenerate_config() を無条件に呼んでいたため、
Orca/SSH を一切使わないユーザーの devbase down でも毎回 ~/.config/devbase/orca/
ssh_config (親ディレクトリ + ヘッダ) が新規生成されていた。round5 で
_maybe_orca_sync に追加した config_exists() ゲートと同じ扱いにし、config が
既に存在するときのみ剪定するよう修正する。剪定ゲートの test を 3 件追加。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 /ndf:fix サマリ (round 6)

codex / gemini が同一箇所を指摘 (2 スレッド, lib/devbase/commands/container.py)。

重要度 件数
critical 0
major 1
minor 0
nit 0
修正 1

対応内容

  • major: _maybe_orca_prune (cmd_down から呼ばれる) が regenerate_config() を無条件呼び出しし、Orca/SSH を一切使わないユーザーの devbase down でも毎回 ~/.config/devbase/orca/ssh_config (親ディレクトリ + ヘッダ) を新規生成していた問題を修正。round5 で _maybe_orca_sync に追加済みの config_exists() ゲートと同じ扱いにし、config が既に存在するときのみ剪定するようにした。
  • 剪定ゲートの test を 3 件追加 (tests/commands/test_container_orca_sync.py)。

検証

  • uv run pytest tests/ -q915 passed (912 + 追加 3)
  • fix commit: 5c2641e
  • 解決スレッド: 2 (container.py) → resolved

CI の完了は待たずに報告しています。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 7 | codex | APPROVE

修正が必要な新規指摘はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 7 | gemini | APPROVE

UI観点での軽微な改善提案を1点のみインラインで残しています。

Comment thread lib/devbase/env/collectors/orca.py Outdated
公開鍵は数百文字・複数行になり得るため、そのまま safe_input の
プロンプトへ埋め込むとターミナル表示が崩れる。鍵種別と末尾数文字
+ (設定済み) の短縮表示に変更。Enter で維持される既定値 (default
引数) はフル鍵のままで、保存値のセマンティクスは不変。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@takemi-ohama

Copy link
Copy Markdown
Contributor Author

🔧 最終スイープ (Step 7.5)

クロスレビューは収束 (codex / gemini とも APPROVE)。残っていた未解決スレッド 1 件をスイープし、未解決スレッド 0 件 で完了しました。

対応内容

  • [minor / UI・UX] collectors/orca.py の SSH_AUTHORIZED_KEYS プロンプト短縮表示
    • 公開鍵 (数百文字・複数行になり得る) をそのまま safe_input のプロンプトへ埋め込むとターミナル表示が崩れる指摘に対応。
    • ssh-ed25519 …<末尾6文字> (設定済み) の短縮表示に変更 (複数行 / 非 ssh- 形式は (設定済み) にフォールバック)。
    • safe_inputdefault 引数にはフル鍵をそのまま渡すため、Enter で既存鍵を維持する挙動・保存値のセマンティクスは不変。
    • ユニットテスト tests/env/test_collector_orca.py を追加 (短縮表示 / フォールバック / プロンプト非漏洩+フル鍵保存の検証)。

検証

  • uv run pytest tests/ -q918 passed (915 + 新規 3)

commit: 107acd6

@takemi-ohama
takemi-ohama merged commit 40428b7 into main Jul 14, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant